package itman.elm.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Method;

//http://localhchost:8080/elmclient/xxx
@WebServlet("/")
public class DispatchServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("uft-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/json;charset=utf-8");

        //1、先获取前端传过来的请求URL
        String path = request.getServletPath();

        //2、从URL中拆出 类名 和 方法名
        String className = path.substring(1, path.lastIndexOf("/"));
        String methodName = path.substring(path.lastIndexOf("/") + 1);

        PrintWriter out = null;

        // 3、判断你的请求路径，根据不同的请求，分发给不同的业务处理器（Servlet == Controller）
        try{

            // 先找到这个类，然后加载它，在程序中，我们运行的是 .class 文件
            Class clazz = Class.forName("itman.elm.controller." + className);

            // 初始化，创建了一个 Controller 对象
            Object controller = clazz.getDeclaredConstructor().newInstance();
            System.out.println("获取到的类名：" + controller.toString());

            // 获取 Controller 对象中的方法
            Method method = clazz.getMethod(methodName, new Class[]{HttpServletRequest.class,HttpServletResponse.class});
            System.out.println("获取到的方法名：" + method.toString());

            // 调用 method
            // 在调用的过程中，需要指定哪个对象来调用的，比如 UserController 才能调用 UserController 中的方法
            // 传过来的参数，其实就是请求路径中的参数，在这里用一个数组来接收
            Object result = method.invoke(controller, new Object[]{request,response});

            // 获取输出流，再将获得的结果进行 JSON 解析，最终响应给客户端
            out = response.getWriter();
            ObjectMapper om = new ObjectMapper();

            out.println(om.writeValueAsString(result));

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            out.close();
        }
    }
}
